package part14;

import com.sun.org.apache.xml.internal.security.Init;

import java.util.Random;

/**
 * @author wcj
 * @Date 2021/5/25 19:48
 * @Version 1.0
 */
public class Part144 {

    public static Random random = new Random(47);

    /**
     * 获取Class对象引用的三种方式
     * 第一种:Class.forName(),这种方式需要传递全限定名作为参数
     * 第二种:对象.getClass(),
     * 第三种:className.class,这种方法是最简单和高效的，推荐使用
     * <p>
     * <p>
     * 其中需要注意第三种方式不会导致类的初始化操作，其它两种会立即让类初始化
     * static final修饰和static修饰的区别，前者为编译期常量，后者在初始化阶段才进行初始化。即前者不需要类的初始化
     *
     * @param args
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws ClassNotFoundException {
        Class initable = Initable.class;
        System.out.println("After create initable class");
        System.out.println(Initable.staticFinal);
        System.out.println(Initable.staticFinal2);
        System.out.println(Initable2.staticNonFinal);
        Class initable3 = Class.forName("part14.Initable3");
        System.out.println("After create initable3 class");
        System.out.println(Initable3.staticNonFinal);
    }
}

class Initable {
    static final int staticFinal = 47;
    static final int staticFinal2 = Part144.random.nextInt(1000);

    static {
        System.out.println("Initializing Initable");
    }
}

class Initable2 {
    static int staticNonFinal = 147;

    static {
        System.out.println("Initializing Initable2");
    }
}

class Initable3 {
    static int staticNonFinal = 74;

    static {
        System.out.println("Initializing Initable3");
    }
}
